
import {constWpsEnum} from "./enum"
import {NewFile, OpenFile, OpenOnLineFile} from "./wpsProcessFunction"
import {setToken, setTenantId, removeToken, getAccessToken, getRefreshToken} from '@/utils/auth'
import {deleteUserCache, setUserCache} from "@/hooks/web/useCache";
import {
  pCheckIs996CodeOffice,
  savePdfoServer,
  saveWpsToServer
} from "@/components/WpsOffice/wps/wpsCommon";
import {useUserStoreWithOut} from "@/store/modules/user";
import {
  fileInfoEnum,
  GetDocParamsValue,
  sendWebNotify,
  setDocParamsValue
} from "@/components/WpsOffice/common/common";

/**
 * web页面调用WPS的方法入口
 *  * info参数结构
 * info:[
 *      {
 *       '方法名':'方法参数',需要执行的方法
 *     },
 *     ...
 *   ]
 * @param {*} info
 */
let testFuncs=null;
function dispatcher(info) {
    try {
      var funcs = info.funcs;
      // 清理用户信息
      if(getRefreshToken() != info.REFRESH_TOKEN){
          removeToken()
          deleteUserCache()
      }
      // 设置token
      {
          const tokenObj = {}
          tokenObj.accessToken = info.ACCESS_TOKEN
          tokenObj.refreshToken = info.REFRESH_TOKEN
          tokenObj.userCache = JSON.parse(info.USER_CACHE)
          setToken(tokenObj)
          setTenantId(info.tenantId);
          setUserCache(tokenObj.userCache)
          // const userStore = useUserStoreWithOut()
          // userStore.setUserInfoAction()
      }
      wps.WpsApplication().Options.UseLocalUserInfo=true//修订时，不使用登录名
      //解析参数
      /**
       * 分两种情况解析：
       * 1、业务系统依赖客户端返回：做同步处理，直接在for循环中返回
       */
      for (var index = 0; index < funcs.length; index++) {
          var func = funcs[index];
          for (var key in func) {
              func[key][fileInfoEnum.routeId] = info[fileInfoEnum.routeId]
              func[key][fileInfoEnum.officeId] = info[fileInfoEnum.officeId]
              if (key === "GetDocStatus") {
                  return GetDocStatus(func[key])
              } else if (key === "ExitWPS") {
                  ExitWPS(func[key])
              } else if (key === "SaveDoc") {
                SaveDoc(func[key])
              } else if (key === "SavePDF") {
                SavePDF(func[key])
              }
          }
      }
      /**
       * 2、业务系统不依赖客户端返回：
       * 做异步处理，先返回接收状态，再在setTimeout中做打开文档的一系列业务逻辑
       */
      setTimeout(function(){
        try {
          for (var index = 0; index < funcs.length; index++) {
              testFuncs=funcs;
              var func = funcs[index];
              for (var key in func) {
                  // 标记文档类型
                  func[key][constWpsEnum.is996Code]=true;
                  func[key][fileInfoEnum.routeId] = info[fileInfoEnum.routeId]
                  func[key][fileInfoEnum.officeId] = info[fileInfoEnum.officeId]
                  if (key === "NewDoc") {
                      OpenDoc(func[key]);
                  }
                  if (key === "OpenDoc") {
                      OpenDoc(func[key]);
                  }
                  if (key === "OnlineEditDoc") {
                    OnlineEditDoc(func[key]);
                  }
                  if (key === "PrintTemplateDoc") {
                    PrintTemplateDoc(func[key])
                  }
              }
          }
        }catch (e) {
          alert("WPS命令执行失败："+e.message)
          alert(e.stack)
        }
      },100)
    }catch (e) {
        alert("OnAddinLoad执行失败："+e.message)
        alert(e.stack)
    }
    return {message:"ok", app:wps.WpsApplication().Name}
}


/**
 * 获取活动文档的状态
 */
function GetDocStatus() {
    let l_doc = wps.WpsApplication().ActiveDocument
    if (l_doc && pCheckIs996CodeOffice()) {//此方法还可根据需要进行扩展
        return{
            message: "GetDocStatus",
            docstatus:{
                words: l_doc.Words.Count,
                saved: l_doc.Saved,
                pages: l_doc.ActiveWindow.Panes.Item(1).Pages.Count
            }
        }
    }
}

/**
 * 关闭WPS活动文档并退出WPS进程
 */
function ExitWPS(param) {

  let count = wps.WpsApplication().Documents.Count;
  let paramActiveWpsId = param[constWpsEnum.ActiveWpsId];
  for(let i=1;i<=count;i++) {
    let l_doc = wps.WpsApplication().Documents.Item(i)
    // 判断是否是需要保存的文件
    let activeWpsId = GetDocParamsValue(l_doc,constWpsEnum.ActiveWpsId);
    if(paramActiveWpsId.includes(activeWpsId)){
      l_doc.Close();
    }
  }
}
/**
 * 关闭WPS活动文档并退出WPS进程
 */
async function SaveDoc(param) {
  let saveWpsToServerRes = {};
  //为了接下来的用户确认操作，先将WPS界面激活显示在最前
  // wps.WpsApplication().Activate();
  let count = wps.WpsApplication().Documents.Count;
  let paramActiveWpsId = param[constWpsEnum.ActiveWpsId];
  let callWpsTraceId = param[constWpsEnum.CallWpsTraceId];
  for(let i=1;i<=count;i++) {
    let l_doc = wps.WpsApplication().Documents.Item(i)
    // 判断是否是需要保存的文件
    let activeWpsId = GetDocParamsValue(l_doc,constWpsEnum.ActiveWpsId);
    if(paramActiveWpsId.includes(activeWpsId)){
      // 保存单个文件
      let saveWpsToServerResTemp = await saveWpsToServer(l_doc);
      saveWpsToServerRes[activeWpsId] = saveWpsToServerResTemp ;
    }
  }

  saveWpsToServerRes[constWpsEnum.CallWpsTraceId] = callWpsTraceId ;
  saveWpsToServerRes[fileInfoEnum.routeId]= param[fileInfoEnum.routeId];
  saveWpsToServerRes[fileInfoEnum.officeId] = param[fileInfoEnum.officeId];

  sendWebNotify("SaveDoc",saveWpsToServerRes)
  for(let i=1;i<=count;i++) {
    let l_doc = wps.WpsApplication().Documents.Item(i)
    // 判断是否是需要保存的文件
    let activeWpsId = GetDocParamsValue(l_doc,constWpsEnum.ActiveWpsId);
    if(paramActiveWpsId.includes(activeWpsId)){
      l_doc.Close();
    }
  }

  return saveWpsToServerRes;
}
/**
 * 关闭WPS活动文档并退出WPS进程
 */
async function SavePDF() {

  //为了接下来的用户确认操作，先将WPS界面激活显示在最前
  // wps.WpsApplication().Activate();
  let l_doc = wps.WpsApplication().ActiveDocument
  let savePdfToServerRes = await savePdfoServer(l_doc);
  alert(JSON.stringify(savePdfToServerRes))
  return savePdfToServerRes;

}

///打开来自OA端传递来的文档
function OpenDoc(docParams) {
  if (docParams.filePathUrl == null || docParams.filePathUrl == "") {
    NewFile(docParams);
  }else {
    OpenFile(docParams);
  }
}

function OnlineEditDoc(docParams) {
  if (docParams.filePathUrl == null || docParams.filePathUrl == "") {
    NewFile(docParams);
  } else {
    //OA传来下载文件的URL地址，调用openFile 方法打开
    OpenOnLineFile(docParams);
  }
}

/**
 * 打印ET
 */
function PrintTemplateDoc(docParams) {

  OpenFile(docParams,(doc)=>{
    // 刷新业务数据
    let bookMarks = doc.Bookmarks
    Object.keys(docParams.dateInfo).forEach(key => {
      let bookMarkItem = bookMarks.Item(key)
      if (bookMarkItem) {
        let bookMarkRange = bookMarkItem.Range
        bookMarkRange.Text = docParams.dateInfo[key]
        bookMarkRange.Select()  //内容替换后不会刷新，让wps作一次刷新，这可能是wps的bug
      }
    });
    setDocParamsValue(doc,constWpsEnum.isPrint,true);
    // 打印文件
    doc.PrintOut();
    // 关闭文件
    doc.Close(false);
  });

}


//这些函数是给wps客户端调用的
export default {
  dispatcher
}
